"""
代理模式(Proxy Pattern): 允许你提供一个代理对象作为另一个对象的接口。控制着对原始对象的访问，并允许创建一些附加行为，例如记录请求日志、缓存数据等。

Subject 是抽象类或接口，定义了 request() 方法的基本契约。RealSubject 实现了 Subject 接口，并实现了具体的 request() 方法。
Proxy 也实现了 Subject 接口，并包含一个 RealSubject 对象的引用。在执行请求之前，Proxy 首先检查用户的访问权限，
然后将请求转发给 RealSubject。通过使用 Proxy 对象，我们可以附加一些额外的功能，例如记录请求日志或缓存数据，而不改变 RealSubject 的代码。
"""


class Subject:
    def request(self):
        pass


class RealSubject(Subject):
    def request(self):
        print("RealSubject: Handling request.")


class Proxy(Subject):
    def __init__(self, real_subject: RealSubject):
        self._real_subject = real_subject

    def request(self):
        if self.check_access():
            self._real_subject.request()

    def check_access(self):
        print("Checking access prior to executing the request.")
        return True


real_subject = RealSubject()
proxy = Proxy(real_subject)

proxy.request()
# "Checking access prior to executing the request."
